/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.NombreComercialMedicamentoFisica;
import hibernate.objeto.NombreComercialMedicamento;
import java.util.Vector;
import presentacion.utilidad.MensajePresentacion;

/**
 *
 * @author Gonzalo
 */
public class NombreComercialMedicamentoLogica extends CapaLogica {

    private static boolean crearComposicion;
    private static boolean crearContraindicaciones;

    public NombreComercialMedicamentoLogica() {
        crearComposicion = false;
        crearContraindicaciones = false;
    }

    /**
     * Agrega/modifica el objeto NombreComercialMedicamento en la base de datos.
     *
     * @param datosMedicamento Los datos del medicamento a agregar
     * @param nombreComercialMedicamento El objeto NombreComercialMedicamento a
     * agregar/modificar
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarOModificarMedicamento(
            Object[] datosMedicamento,
            NombreComercialMedicamento nombreComercialMedicamento) {

        nombreComercialMedicamento =
                crearObjetoNombreComercialMedicamento(datosMedicamento,
                nombreComercialMedicamento);

        return CapaFisica.guardarOActualizarObjeto(nombreComercialMedicamento);
           
    }

    /**
     * Elimina lógicamente un nombre comercial de la base de datos.
     *
     * @param nombreComercialMedicamento El nombre comercial recibido
     * @return true si se eliminó correctamente false en caso contrario
     */
    public static boolean eliminarNombreComercialMedicamento(
            NombreComercialMedicamento nombreComercialMedicamento) {
        if (esNombreComercialMedicamentoLibre(nombreComercialMedicamento)) {
            //Setea inactivo
            nombreComercialMedicamento.setEnBdNombreComercialMedicamento(false);

            //Guarda en la base de datos
            return NombreComercialMedicamentoFisica.guardarOActualizarObjeto(
                nombreComercialMedicamento);
        } else {
            MensajePresentacion.informarImposibilidadEliminarMedicamento();
            return false;
        }

        
    }

    /**
     * Verifica si alguna entidad esta relacionada al objeto.
     *
     * @param nombreComercialMedicamento  el objeto a consultar
     * @return true si está libre, false si esta vinculada
     */
    private static boolean esNombreComercialMedicamentoLibre(NombreComercialMedicamento nombreComercialMedicamento) {
        if (nombreComercialMedicamento.getFarmacologicos().isEmpty() &&
                nombreComercialMedicamento.getAplicacionVacunas().isEmpty()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto NombreComercialMedicamento y si ya existe lo obtiene de la
     * base de datos.
     *
     * @param datosMedicamento Los datos del medicamento a agregar
     * @param nombreComercialMedicamentoAModificar El objeto NombreComercialMedicamento a
     * agregar
     * @return El objeto creado u obtenido
     */
    private static NombreComercialMedicamento
             crearObjetoNombreComercialMedicamento(Object[] datosMedicamento,
             NombreComercialMedicamento nombreComercialMedicamentoAModificar) {

        NombreComercialMedicamento nombreComercialMedicamentoExistio =
                getNombreComercialMedicamentoPorNombreComercialYPorEnBd(
                datosMedicamento[CapaLogica.MEDICAMENTO_NOMBRE_COMERCIAL].
                toString(), false);

        if (nombreComercialMedicamentoAModificar != null &&
                nombreComercialMedicamentoExistio != null) {
            nombreComercialMedicamentoExistio
                    .setEnBdNombreComercialMedicamento(true);
            nombreComercialMedicamentoAModificar =
                    nombreComercialMedicamentoExistio;
        }

        seDebenCrearObjetosRelacionados(datosMedicamento);

        //Medicamento 0: Nombre comercial
        nombreComercialMedicamentoAModificar.setNombreNombreComercialMedicamento(
                datosMedicamento[CapaLogica.MEDICAMENTO_NOMBRE_COMERCIAL].
                toString().toUpperCase());
        nombreComercialMedicamentoAModificar.setEnBdNombreComercialMedicamento(true);

        //Medicamento 1: Principio activo
        int[] idObjetoCreado = new int[1];
        //Vinculo el objeto
        if (PrincipioActivoMedicamentoLogica.
                agregarOModificarPrincipioActivoMedicamento(datosMedicamento,
                idObjetoCreado)) {
            nombreComercialMedicamentoAModificar.setPrincipioActivoMedicamento(
                 PrincipioActivoMedicamentoLogica.
                 getPrincipioActivoMedicamentoPorId(idObjetoCreado[0]));
        }

        //Medicamento 2: Grupo terapéutico
        idObjetoCreado = new int[1];
        //Vinculo el objeto
        if (GrupoTerapeuticoMedicamentoLogica.
                agregarOModificarGrupoTerapeuticoMedicamento(datosMedicamento,
                idObjetoCreado)) {
            nombreComercialMedicamentoAModificar.setGrupoTerapeuticoMedicamento(
                 GrupoTerapeuticoMedicamentoLogica.
                 getGrupoTerapeuticoMedicamentoPorId(idObjetoCreado[0]));
        }

        //Medicamento 3: Laboratorio
        idObjetoCreado = new int[1];
        //Vinculo el objeto
        if (LaboratorioMedicamentoLogica.
                agregarOModificarLaboratorioMedicamento(datosMedicamento,
                idObjetoCreado)) {
            nombreComercialMedicamentoAModificar.setLaboratorioMedicamento(
                 LaboratorioMedicamentoLogica.
                 getLaboratorioMedicamentoPorId(idObjetoCreado[0]));
        }

        if (crearComposicion) {
            //Medicamento 4: Composición nombre comercial
            idObjetoCreado = new int[1];
            //Vinculo el objeto
            if (ComposicionMedicamentoLogica.
                    agregarOModificarComposicionMedicamento(datosMedicamento,
                    idObjetoCreado)) {
                nombreComercialMedicamentoAModificar.setComposicionMedicamento(
                     ComposicionMedicamentoLogica.
                     getComposicionMedicamentoPorId(idObjetoCreado[0]));
            }
        }

        if (datosMedicamento[
                CapaLogica.MEDICAMENTO_PRESENTACION_NOMBRE_COMERCIAL] != null) {
            //Medicamento 5: Presentación nombre comercial
            nombreComercialMedicamentoAModificar.
                    setPresentacionesNombreComercialMedicamento(datosMedicamento[
                    CapaLogica.MEDICAMENTO_PRESENTACION_NOMBRE_COMERCIAL].toString());
        }

        if (crearContraindicaciones) {
            //Medicamento 6: Contraindicaciones nombre comercial
            idObjetoCreado = new int[1];
            //Vinculo el objeto
            if (ContraindicacionesMedicamentoLogica.
                    agregarOModificarContraindicacionesMedicamento(datosMedicamento,
                    idObjetoCreado)) {
                nombreComercialMedicamentoAModificar.setContraindicacionesMedicamento(
                     ContraindicacionesMedicamentoLogica.
                     getContraindicacionesMedicamentoPorId(idObjetoCreado[0]));
            }
        }

        if (datosMedicamento[
                CapaLogica.MEDICAMENTO_DOSIFICACION_NOMBRE_COMERCIAL] != null) {
            //Medicamento 7: Dosificación nombre comercial
            nombreComercialMedicamentoAModificar.
                    setDosificacionNombreComercialMedicamento(datosMedicamento[
                    CapaLogica.MEDICAMENTO_DOSIFICACION_NOMBRE_COMERCIAL].toString());
        }

        if (datosMedicamento[
                CapaLogica.MEDICAMENTO_INDICACIONES_NOMBRE_COMERCIAL] != null) {
            //Medicamento 8: Indicaciones nombre comercial
            nombreComercialMedicamentoAModificar.
                    setIndicacionesNombreComercialMedicamento(datosMedicamento[
                    CapaLogica.MEDICAMENTO_INDICACIONES_NOMBRE_COMERCIAL].toString());
        }

        if (datosMedicamento[
                CapaLogica.MEDICAMENTO_ACCION_TERAPEUTICA_NOMBRE_COMERCIAL] != null) {
            //Medicamento 9: Acción terapéutica nombre comercial
            nombreComercialMedicamentoAModificar.
                    setAccionTerapeuticaNombreComercialMedicamento(datosMedicamento[
                    CapaLogica.MEDICAMENTO_ACCION_TERAPEUTICA_NOMBRE_COMERCIAL].
                    toString());
        }

        if (datosMedicamento[
                CapaLogica.MEDICAMENTO_CONTRAINDICACIONES_PRINCIPIO_ACTIVO] != null) {
            //Medicamento 10: Contraindicaciones principio activo
            nombreComercialMedicamentoAModificar.getPrincipioActivoMedicamento().
                    setContraindicacionesPrincipioActivoMedicamento(
                    datosMedicamento[
                    CapaLogica.MEDICAMENTO_CONTRAINDICACIONES_PRINCIPIO_ACTIVO]
                    .toString());
        }

        if (datosMedicamento[
                CapaLogica.MEDICAMENTO_PRECAUCIONES_PRINCIPIO_ACTIVO] != null) {
            //Medicamento 11: Precauciones principio activo
            nombreComercialMedicamentoAModificar.getPrincipioActivoMedicamento().
                    setPrecaucionesPrincipioActivoMedicamento(datosMedicamento[
                    CapaLogica.MEDICAMENTO_PRECAUCIONES_PRINCIPIO_ACTIVO].toString());
        }

        if (datosMedicamento[
                CapaLogica.MEDICAMENTO_EMBARAZO_Y_LACTANCIA_PRINCIPIO_ACTIVO] != null) {
            //Medicamento 12: embarazo y lactancia principio activo
            nombreComercialMedicamentoAModificar.getPrincipioActivoMedicamento().
                    setEmbarazoPrincipioActivoMedicamento(datosMedicamento[
                    CapaLogica.MEDICAMENTO_EMBARAZO_Y_LACTANCIA_PRINCIPIO_ACTIVO].
                    toString());
        }

        if (datosMedicamento[
                CapaLogica.MEDICAMENTO_INTERACCIONES_PRINCIPIO_ACTIVO] != null) {
            //Medicamento 13: Interacciones principio activo
            nombreComercialMedicamentoAModificar.getPrincipioActivoMedicamento().
                    setInteraccionesPrincipioActivoMedicamento(datosMedicamento[
                    CapaLogica.MEDICAMENTO_INTERACCIONES_PRINCIPIO_ACTIVO].toString());
        }

        return nombreComercialMedicamentoAModificar;
    }

    /**
     * Establece a verdadero el valor de las variables cuyos objetos deben
     * crearse y vincularse al objeto NombreComercialMedicamento. Eso es así
     * debido a que los campos son no obligatorios.
     *
     * @param datosMedicamento Los datos del medicamento a agregar
     */
    private static void seDebenCrearObjetosRelacionados(Object[] datosMedicamento) {
        if(datosMedicamento[
                CapaLogica.MEDICAMENTO_COMPOSICION_NOMBRE_COMERCIAL] != null) {
            crearComposicion = true;
        }

        if(datosMedicamento[
                CapaLogica.MEDICAMENTO_CONTRAINDICACIONES_NOMBRE_COMERCIAL] != null) {
            crearContraindicaciones = true;
        }
    }

    /**
     * Retorna el vector de objetos NombresComercialMedicamento que están activos
     * en la base de datos.
     *
     * @return El vector de objetos NombreComercialMedicamento consultado, null
     * si no existe
     */
    public static Vector<NombreComercialMedicamento> getAllEnBd(){
        return NombreComercialMedicamentoFisica.getAllEnBd();
    }

    /**
     * Retorna el vector de objetos NombrecomercialMedicamento, según el
     * nombre comercial del medicamento, ordenado por nombre de medicamento.
     *
     * @param nombreComercialMedicamento El nombre comercial del medicamento
     * @param estado false si es baja lógica, true si aún activo
     * @return El vector de objetos NombreComercialMedicamento consultado, null
     * si no existe
     */
    public static Vector<NombreComercialMedicamento>
            getVectorNombreComercialMedicamentoEnBdPorNombreComercialYPorEnBd(
            String nombreComercialMedicamento, boolean estado){
        return NombreComercialMedicamentoFisica.
                getVectorNombreComercialMedicamentoEnBdPorNombreComercialYEnBd(
                reemplazarUnApostrofoPorDosApostrofos(
                nombreComercialMedicamento), estado);
    }

    /**
     * Retorna el vector de objetos NombresComercialMedicamento según el
     * principio activo asociado.
     *
     * @param nombrePrincipioActivoMedicamento El nombre del principio activo
     * asociado
     * @param estado false si es baja lógica, true si aún activo
     * @return El vector de objetos NombreComercialMedicamento consultado, null
     * si no existe
     */
    public static Vector<NombreComercialMedicamento>
            getVectorNombreComercialMedicamentoEnBdPorPrincipioActivoMedicamentoYPorEnBd(
            String nombrePrincipioActivoMedicamento, boolean estado) {
        return NombreComercialMedicamentoFisica.
                getVectorNombreComercialMedicamentoEnBdPorPrincipioActivoMedicamentoYEnBd(
                reemplazarUnApostrofoPorDosApostrofos(
                nombrePrincipioActivoMedicamento), estado);
    }

    /**
     * Retorna el vector de objetos NombreComercialMedicamento según el grupo
     * terapeutico asociado.
     *
     * @param nombreGrupoTerapeuticoMedicamento El nombre del grupo terapeutico
     * asociado
     * @param estado false si es baja lógica, true si aún activo
     * @return El vector de objetos NombreComercialMedicamento consultado, null
     * si no existe
     */
    public static Vector<NombreComercialMedicamento>
            getVectorNombreComercialMedicamentoEnBdPorGrupoTerapeuticoMedicamentoYPorEnBd(
            String nombreGrupoTerapeuticoMedicamento, boolean estado) {
        return NombreComercialMedicamentoFisica.
                getVectorNombreComercialMedicamentoEnBdPorGrupoTerapeuticoMedicamentoYEnBd(
                reemplazarUnApostrofoPorDosApostrofos(
                nombreGrupoTerapeuticoMedicamento), estado);
    }

    /**
     * Retorna el vector de objetos NombreComercialMedicamento según el
     * laboratorio asociado.
     *
     * @param nombreLaboratorioMedicamento El nombre del laboratorio asociado
     * @param estado false si es baja lógica, true si aún activo
     * @return Un vector de objetos NombreComercial consultado, null si no existe
     */
    public static Vector<NombreComercialMedicamento>
            getVectorNombreComercialMedicamentoEnBdPorLaboratorioMedicamentoYPorEnBd(
            String nombreLaboratorioMedicamento, boolean estado) {
        return NombreComercialMedicamentoFisica.
                getVectorNombreComercialMedicamentoPorLaboratorioMedicamentoYEnBd(
                reemplazarUnApostrofoPorDosApostrofos(
                nombreLaboratorioMedicamento), estado);
    }

    /**
     * Retorna el objeto NombreComercialMedicamento según el nombre comercial
     * del medicamento.
     *
     * @param nombreComercialMedicamento El nombre comercial del medicamento
     * @param estado false si es baja lógica, true si aún activo
     * @return El objeto NombreComercial consultado, null si no existe
     */
    public static NombreComercialMedicamento
            getNombreComercialMedicamentoPorNombreComercialYPorEnBd(
            String nombreComercialMedicamento, boolean estado) {
        return NombreComercialMedicamentoFisica.
                getNombreComercialMedicamentoPorNombreComercialYPorEnBd(
                reemplazarUnApostrofoPorDosApostrofos(
                nombreComercialMedicamento), estado);
    }

    /**
     * Retorna el objeto NombreComercialMedicamento según el id.
     *
     * @param idNombreComercialMedicamento El id del nombre comercial
     * @return El objeto NombreComercialMedicamento consultado, null si no existe
     */
    public static NombreComercialMedicamento getNombreComercialMedicamentoPorId(
            int idNombreComercialMedicamento) {
        return NombreComercialMedicamentoFisica.
                getNombreComercialMedicamentoPorIdYPorEnBd(
                idNombreComercialMedicamento, true);
    }

    /**
     * Verifica si un nombre comercial ya se encuentra cargado en la base de
     * datos.
     *
     * @param nombreNombreComercial El nombre comercial del medicamento a
     * investigar
     * @return true si existe, false en caso contrario
     */
    public static boolean getExisteNombreComercialMedicamentoPorNombreComercialYPorEnBd(
            String nombreNombreComercial) {
        return (NombreComercialMedicamentoFisica.
                getNombreComercialMedicamentoPorNombreComercialYPorEnBd(
                reemplazarUnApostrofoPorDosApostrofos(
                nombreNombreComercial), true) != null);
    }

    /**
     * Retorna el texto HTML correspondiente a la información del nombre
     * comercial.
     * @param nombreComercial El nombre comercial del medicamento
     * @param laboratorio El nombre del laboratorio
     * @param composicion La composición del medicamento
     * @param presentaciones Las presentaciones
     * @param accionTerapeutica La acción terapéutica
     * @param contraindicaciones Las contraindicaciones
     * @param dosificacion La dosificación
     * @param indicaciones Las indicaciones
     * @return El String que contiene el HTML
     */
    public static String getNombreComercialHTML(String nombreComercial,
            String laboratorio, String composicion, String presentaciones,
            String accionTerapeutica, String contraindicaciones,
            String dosificacion, String indicaciones) {
        String stringHTML = "<head><base href=\"file:d:/\"></head>"
                    + "<b>" + nombreComercial + " - " + laboratorio + "</b><br><br>"
                    + "<font color=\"blue\">Composición</font><br>"
                    + "<font face=\"arial\">" + composicion + "</font><br>"
                    + "<font color=\"blue\">Presentación</font><br>"
                    + "<font face=\"arial\">" + presentaciones + "</font><br>"
                    + "<font color=\"blue\">Acción terapéutica</font><br>"
                    + "<font face=\"arial\">" + accionTerapeutica + "</font><br>"
                    + "<font color=\"blue\">Contraindicaciones</font><br>"
                    + "<font face=\"arial\">" + contraindicaciones + "</font><br>"
                    + "<font color=\"blue\">Dosificación</font><br>"
                    + "<font face=\"arial\">" + dosificacion + "</font><br>"
                    + "<font color=\"blue\">Indicaciones</font><br>"
                    + "<font face=\"arial\">" + indicaciones + "</font><br>";
        return stringHTML;
    }

    /**
     * Retorna el texto HTML correspondiente a la información de que no existe
     * información.
     *
     * @param noExisteInformacionDisponible  El título de que no existe
     * información disponible
     * @return El String que contiene el HTML
     */
    public static String getNoExisteInformacionDisponibleHTML(
            String noExisteInformacionDisponible) {
        String stringHTML = "<head><base href=\"file:d:/\"></head>"
                    + "<b>" + noExisteInformacionDisponible + "</b><br><br>"
                    + "<font face=\"arial\"> El fabricante no ha proporcionado "
                    + "ninguna información de lo solicitado</font><br>";
        return stringHTML;
    }

}

